Imports DataAccesGenerales
Imports DataAcces
Imports System.Data

Partial Class Documentos_Capt_ServiciosMultiples_Capt_ServiciosMultiplesDocumento
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Try
      If Not Page.IsPostBack Then
        Dim datosUsuario As New dataLogin
        Dim consGenerales As New DataAccesGenerales()
        datosUsuario = Session("Data_Login")
        Dim nidDocumento As String = Request.QueryString("nidDocumento")
        Dim nidUsuario As Long
        nidUsuario = consGenerales.usuarioObtieneNidUsuario(Session("Data_Login"))
        'Me.ctlArchivoAnexos.asignarParametros(nidUsuario, nidDocumento, 3)

        If Not nidDocumento = String.Empty Then
          Me.ctlEncabezadoDocumento.ObtenerDocumento(CLng(nidDocumento))
          cargarDatos()
          cargarConsulta(CLng(nidDocumento))
          habilitarCampos(CInt(Me.ctlEncabezadoDocumento.EstadoDocumento))
        Else
          Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Nuevo
          habilitarCampos(enumEstadoDeDocumento.Nuevo)
          'Me.ctlArchivoAnexos.eliminarArchivosLista()
          If consGenerales.usuarioTieneElRol(nidUsuario, ?nidRol) <> 1 Then 'nidRol=nid tipo de usuario que tiene permiso para el documento
            ctlToolBar.Visible = False
            mensaje("No tiene Permisos para este documento")
          End If
        End If
      End If
    Catch ex As Exception
      mensaje("Error al cargar Pagina: " + ex.Message)
    End Try
  End Sub

#Region "Eventos"
  Protected Sub ctlToolbar_BtnNuevoClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnNuevoClicked
    nuevoDocumento()
    cargarDatos()
  End Sub
  Protected Sub ctlToolbar_BtnGuardarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnGuardarClicked
    If VerificarDatos() Then
      If Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar Then
        crearDocumento()
        If Me.ctlEncabezadoDocumento.NidDocumento <> 0 Then
          guardarDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Me.hfGuardar.Value)
        End If
      Else
        guardarDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Me.hfGuardar.Value)
      End If
    End If
  End Sub
  Protected Sub ctlToolbar_BtnAprobarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnAprobarClicked
    firmarDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnEditarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnEditarClicked
    editarDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnImprimirClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnImprimirClicked
    imprimirDocumento()
  End Sub
  Protected Sub ctlToolbar_BtnListaClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnListaClicked
    consultarIncidencias()
  End Sub
  Protected Sub ctlToolbar_BtnRechazarClicked(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlToolBar.BtnRechazarClicked
    cancelarDocumento()
  End Sub
  
  Protected Sub ctlDocumentoCancelar_BtnCancelarDoc(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlDocumentoCancelar.BtnCancelarDoc
    If Not Me.ctlDocumentoCancelar.DescripcionCancelacion = String.Empty Then
      confirmarDocumento(enumEstadoDeDocumento.Rechazado)
    Else
      mensaje("Debe indicar el motivo de rechazo")
    End If
  End Sub
  
   Protected Sub ctlDocumentoFirmar_BtnFirmarDoc(ByVal sender As Object, ByVal e As System.EventArgs) Handles ctlDocumentoFirmar.BtnFirmarDoc
    If Me.ctlDocumentoFirmar.validarCertificadosAgregados() Then
      If Me.ctlDocumentoFirmar.validarExtensionLlaves() Then
        If Me.ctlDocumentoFirmar.validarContrase�a() Then
          Try
            firmar()
          Catch ex As Exception
            mensaje(ex.Message)
          End Try
        Else
          mensaje("Debe indicar la contrase�as")
        End If
      Else
        mensaje("Los archivo de llave Privada � P�blica no son validos")
      End If
    Else
      mensaje("Debe cargar las llaves Privada y P�blica")
    End If

  End Sub
  
  
  
#End Region

#Region "Metodos"
  ''' <summary>
  ''' Metodo para cargar todos los datos requeridos para llenar el archivo
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub cargarDatos()
    'Datos a cargar al inicio del documento
  End Sub
  ''' <summary>
  ''' Metodo para cargar los datos al consultar el documento previamente creado y guardado en la base de datos
  ''' </summary>
  ''' <param name="nidDocumento"> nid del documento a cargar</param>
  ''' <remarks></remarks>
  Private Sub cargarConsulta(nidDocumento As Integer)
    'Carga los datos de una consulta del documento
	Me.hfGuardar.Value = 1 'tipo de guardado de modificacion
	Dim dCapt_ServiciosMultiples As New DataAccesCapt_ServiciosMultiples
    Dim tablaCapt_ServiciosMultiples As DataTable
	
	tablaCapt_ServiciosMultiples = dCapt_ServiciosMultiples.Capt_ServiciosMultiples_Consultar(Me.ctlEncabezadoDocumento.NidDocumento)
	
  End Sub
  ''' <summary>
  ''' Metodo para habilitar los campos dependiendo del estado actual del documento
  ''' el cual puede ser alguna de estas opciones:
  ''' Nuevo
  ''' NuevoAGuardar
  ''' PendienteDeAprobacion
  ''' Aprobado
  ''' Rechazado
  ''' Terminado
  ''' </summary>
  ''' <param name="estadoDoc"> estado del documento actualmente</param>
  ''' <remarks>El estado se obtine del control ctlEncabezadoDocumento</remarks>
  Private Sub habilitarCampos(ByVal estadoDoc As DataAccesGenerales.enumEstadoDeDocumento)
    Select Case estadoDoc
      Case enumEstadoDeDocumento.Nuevo
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Nuevo)

      Case enumEstadoDeDocumento.NuevoAGuardar
        habilitarDocumento(True)
        ' Header
        Me.ctlEncabezadoDocumento.TextoCodigo = textoEcabezado.enElaboracion
        Me.ctlEncabezadoDocumento.TextoFechaCreacion = Now.Date.ToShortDateString()
        Me.ctlEncabezadoDocumento.TextoEstado = textoEcabezado.nuevo
        Dim datUsuario As New DataAccesGenerales()
        Me.ctlEncabezadoDocumento.TextoEmisor = datUsuario.usuarioObtieneNombre(Session("Data_Login"))
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.NuevoAGuardar)

      Case enumEstadoDeDocumento.PendienteDeAprobacion
        Dim conDoc As New DataAccesGenerales()
        If conDoc.consultaUsuarioTienFlujoActual(Me.ctlEncabezadoDocumento.NidDocumento, Session("Data_Login")) = 1 Then
          If conDoc.usuarioEsCreadorDocumento(Me.ctlEncabezadoDocumento.NidDocumento, Session("Data_Login")) = creadorDocumento.esUsuarioCreador Then
            habilitarDocumento(True)
          Else
            habilitarDocumento(False)
          End If
        Else
          habilitarDocumento(False)
        End If
        Me.ctlToolBar.NidDocumentoValor = Me.ctlEncabezadoDocumento.NidDocumento
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.PendienteDeAprobacion)

      Case enumEstadoDeDocumento.Aprobado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Aprobado)

      Case enumEstadoDeDocumento.Rechazado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Rechazado)

      Case enumEstadoDeDocumento.Terminado
        habilitarDocumento(False)
        Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.Terminado)
    End Select
  End Sub
  ''' <summary>
  ''' Metodo para establecer un encabezado al documento, generando una nueva clave de documento
  ''' y cambiando su estado a NuevoAGuardar
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub nuevoDocumento()
    'Genera un encabezado del documento
    Dim datUsuario As New DataAccesGenerales()
    Me.ctlEncabezadoDocumento.TextoEmisor = datUsuario.usuarioObtieneNombre(Session("Data_Login"))
    Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar
    Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.NuevoAGuardar)

    Me.ctlEncabezadoDocumento.TextoCodigo = textoEcabezado.enElaboracion
    Me.ctlEncabezadoDocumento.TextoFechaCreacion = Now.Date.ToShortDateString()
    Me.ctlEncabezadoDocumento.TextoEstado = textoEcabezado.nuevo
    habilitarDocumento(True)
  End Sub
  ''' <summary>
  ''' Metodo para habilitar o desabilitar los componentes del documento
  ''' </summary>
  ''' <param name="bol_Estado">True o False</param>
  ''' <remarks></remarks>
  Private Sub habilitarDocumento(bol_Estado As Boolean)
    'Habilita los campos necesarios para realizar el documento

  End Sub
  ''' <summary>
  ''' Metodo para insertar un nuevo documento en la base de datos
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub crearDocumento()
    'Crea un documento nuevo en la base de datos
    Dim dGenerales As New DataAccesGenerales
    Dim nidEmpresa As Integer = dGenerales.UsuarioObtieneNidEmpresa(Session("Data_Login"))
    Dim nidusuario As Integer = dGenerales.usuarioObtieneNidUsuario(Session("Data_Login"))
    Dim documentoNoGuardado As Byte = 0
    Dim nidDocumento As Integer = 0
    Dim transaccionFlujo As Byte = 0 ' Crea flujo documento 

    Try
      nidDocumento = dGenerales.insertaEncabezadoDocumento(enumTipoDocumento.Capt_ServiciosMultiples, nidEmpresa, nidusuario) ' Crea encabezado documetno
      If nidDocumento <> transaccion.transaccionNoTerminada Then
        transaccionFlujo = dGenerales.insertaFlujoDocumento(nidDocumento, enumTipoDocumento.Capt_ServiciosMultiples, nidusuario)
        If transaccionFlujo <> transaccion.transaccionNoTerminada Then ' Crea flujo documento detalle
          Me.ctlEncabezadoDocumento.NidDocumento = nidDocumento
          ctlEncabezadoDocumento.ObtenerDocumento(nidDocumento)
          Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.PendienteDeAprobacion
          Me.ctlToolBar.NidDocumentoValor = nidDocumento
          Me.ctlToolBar.habilitarBotones(enumEstadoDeDocumento.PendienteDeAprobacion)
        End If
      End If
    Catch ex As Exception
      mensaje("Error en crearDocumento(): " & ex.Message)
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para guardar el archivo creado en la base de datos
  ''' pasando como parametros el nid del documento y un tipo de guardado
  ''' el cual es:
  ''' 0: insertar nuevo
  ''' 1: actualizar
  ''' </summary>
  ''' <param name="nidDocumento">nid del documento actual</param>
  ''' <param name="tipoGuradado">tipo de guardado</param>
  ''' <remarks>el nid documento se obtiene del control ctlEncabezadoDocumento</remarks>
  Private Sub guardarDocumento(nidDocumento As Integer, tipoGuradado As Integer)
    'Datos necesarios para guardar el documento
	Dim transaccion As Byte = 0
    Dim str_Mensaje As String = ""
    Dim dCapt_ServiciosMultiples As New DataAccesCapt_ServiciosMultiples
	Dim pnid As Long
    Dim pnidDocumento As Long
    Dim pnidBuque As Integer
    Dim pnombreBuque As String
    Dim pnombreSolicitante As String
    Dim pcargoSolicitante As String
    Dim pfInicio As Date
    Dim pfFin As Date
    

    Try
      If tipoGuradado = 0 Then
        transaccion = dCapt_ServiciosMultiples.Capt_ServiciosMultiples_Insertar(pnid, pnidDocumento, pnidBuque, pnombreBuque, pnombreSolicitante, pcargoSolicitante, pfInicio, pfFin)
        If transaccion = 1 Then
		  Me.hfGuardar.Value = 1
          str_Mensaje = "Documento guardado con �xito, No olvide Firmar"
        Else
          str_Mensaje = "Error al guardar el documento"
        End If
      ElseIf tipoGuradado = 1 Then
        transaccion = dCapt_ServiciosMultiples.Capt_ServiciosMultiples_Modificar(pnid, pnidDocumento, pnidBuque, pnombreBuque, pnombreSolicitante, pcargoSolicitante, pfInicio, pfFin)
        If transaccion = 1 Then
          str_Mensaje = "Documento actualizado con �xito, No olvide Firmar"
        Else
          str_Mensaje = "Error al actualizar documento"
        End If
      End If
        mensaje(str_Mensaje)
    Catch ex As Exception
      mensaje("Error al guardar archivo: " + ex.Message)
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para llamar al control ctlDocumentoFirmar el cual se encarga de mostrar la pantalla
  ''' para la carga de los archivos necesarios para la firma del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub firmarDocumento()
    Me.ctlDocumentoFirmar.CodigoDocumento = Me.ctlEncabezadoDocumento.TextoCodigo
    Me.mpeFirmarDocumento.Show()
  End Sub
  ''' <summary>
  ''' Metodo para realizar el firmado del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub firmar()
    Try
      Dim datosSolicitud As New DataAccesCapt_ServiciosMultiples
      Dim datosGeneral As New DataAccesGenerales
      Dim dataLogin As New dataLogin
      dataLogin = Session("Data_Login")
      Dim firmarDocumento As New DataAccesFirmarDocumento()
      firmarDocumento.ContrasenaVal = ctlDocumentoFirmar.Contrasena
      firmarDocumento.DatosCertificadoVal = ctlDocumentoFirmar.DatosCertificadoCargado
      firmarDocumento.DatosLlaveVal = ctlDocumentoFirmar.DatosLlaveCargado
      firmarDocumento.NidDocumentoVal = ctlEncabezadoDocumento.NidDocumento
      firmarDocumento.NidUsuarioVal = datosGeneral.usuarioObtieneNidUsuario(dataLogin)
      firmarDocumento.XmlBaseValue = datosSolicitud.Capt_ServiciosMultiples_CadenaOriginalXMLChilkat(Me.ctlEncabezadoDocumento.NidDocumento)
      firmarDocumento.CodigoDocumentoVal = Me.ctlEncabezadoDocumento.TextoCodigo

      If firmarDocumento.firmarDocumentoXML() = DataAccesGenerales.transaccion.terminado Then
        Dim conDoc As New DataAccesGenerales
        If conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), enumEstadoDeDocumento.Aprobado, String.Empty, Session("Data_Login")) = DataAccesGenerales.transaccion.terminado Then
          Me.ctlEncabezadoDocumento.ObtenerDocumento(Me.ctlEncabezadoDocumento.NidDocumento)
          habilitarCampos(Me.ctlEncabezadoDocumento.EstadoDocumento)
          Me.ctlDocumentoFirmar.CelloDigital = firmarDocumento.CadenaHASHValue
          Me.ctlDocumentoFirmar.HabilitarFirmado = False
          mensaje("Confirmaci�n Realizada")
        Else
          mensaje("Error Inesperado No es posible realizar firmado")
        End If
      Else
        Me.ctlDocumentoFirmar.Mensaje = "No es posible realizar firmado"
        Me.mpeFirmarDocumento.Show()
      End If
    Catch ex As Exception
      Throw ex
    End Try
  End Sub
  ''' <summary>
  ''' Metodo para generar una nueva clave de documento si borrar los datos actuales de la pagina
  ''' y asi permitir la edicion del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub editarDocumento()
    Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.NuevoAGuardar
    Me.ctlEncabezadoDocumento.NidDocumento = 0
    Me.habilitarCampos(enumEstadoDeDocumento.NuevoAGuardar)
  End Sub
  ''' <summary>
  ''' Metodo para direccionar la pagina a donde se pueda ver el reporte del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub imprimirDocumento()
    'Response para direccionar al la pagina del reporte a imprimir
    'Response.Redirect("~\Documentos\Capt_ServiciosMultiples\Reporte\Capt_ServiciosMultiplesReporte.aspx?" & "nidDocumento=" & Me.ctlEncabezadoDocumento.NidDocumento)
  End Sub
  ''' <summary>
  ''' Metodo para mostrar la incidencias del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub consultarIncidencias()
    Me.ctlDocumentoIncidencias.consultarIncidencias(Me.ctlEncabezadoDocumento.NidDocumento)
    Me.mpeDocIncidencias.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar la pantalla de cancelar documento la cual se encarga
  ''' de la cancelacion del documento
  ''' </summary>
  ''' <remarks></remarks>
  Private Sub cancelarDocumento()
    Me.mpeDocCancelar.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar un mensaje en la pantalla
  ''' </summary>
  ''' <param name="mensaje">mensaje a mostrar en pantalla</param>
  ''' <remarks></remarks>
  Private Sub mensaje(mensaje As String)
    Me.ctlDocumentoMensaje.Mensaje = mensaje
    Me.mpeMensaje.Show()
  End Sub
  ''' <summary>
  ''' Metodo para mostrar los mensajes de validacion
  ''' </summary>
  ''' <param name="mensaje"> mensaje a mostrar en pantalla</param>
  ''' <remarks></remarks>
  Public Sub mensajeValidacion(ByVal mensaje As String)
    Me.ctlMensajeValidacion.Mensaje = mensaje
    Me.mpeMenValidacion.Show()
  End Sub
  ''' <summary>
  ''' Metodo para confirmar el documento el cual puede ser
  ''' Cancelado o Aprobado
  ''' </summary>
  ''' <param name="tipoConfirmacion"> tipo de confirmacion deceada</param>
  ''' <remarks></remarks>
  Private Sub confirmarDocumento(ByVal tipoConfirmacion As enumEstadoDeDocumento)
    Dim conDoc As New DataAccesGenerales
    Dim transaccion As SByte

    Try
      Select Case tipoConfirmacion
        Case enumEstadoDeDocumento.Aprobado
          transaccion = conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), _
                                                  enumEstadoDeDocumento.Aprobado, String.Empty, Session("Data_Login"))
          If transaccion <> DataAccesGenerales.transaccion.transaccionNoTerminada Then
            Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Aprobado
            habilitarCampos(enumEstadoDeDocumento.Aprobado)
            mensaje("Confirmaci�n Realizada")
          End If

        Case enumEstadoDeDocumento.Rechazado
          transaccion = conDoc.confirmarDocumento(CInt(Me.ctlEncabezadoDocumento.NidDocumento), _
                                                  enumEstadoDeDocumento.Rechazado, Me.ctlDocumentoCancelar.DescripcionCancelacion, Session("Data_Login"))
          If transaccion <> DataAccesGenerales.transaccion.transaccionNoTerminada Then
            Me.ctlEncabezadoDocumento.EstadoDocumento = enumEstadoDeDocumento.Rechazado
            habilitarCampos(enumEstadoDeDocumento.Rechazado)
            mensaje("El documento ha sido cancelado")
          End If
      End Select

    Catch ex As Exception
      mensaje(ex.Message)
    End Try
  End Sub
  
  ''' <summary>
  ''' Metodo para verificar que los datos sean los correctos
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Private Function VerificarDatos() As Boolean
    Dim str_Mensaje As String = ""
    Dim bol_valor As Boolean = False
	Try
      
	  
      If str_Mensaje = "" Then
        bol_Valor = True
      Else
        bol_Valor = False
        mensajeValidacion("Datos no validos" + Chr(13) + str_Mensaje)
      End If

    Catch ex As Exception
      bol_Valor = False
      mensajeValidacion("Error en el metodo VerificarDatos(): " + ex.Message)
    End Try
	
    Return bol_valor
  End Function

  
#End Region
End Class
  
